<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            改变 this -》  
                1-箭头函数--****(普通函数和箭头函数)
                    函数改成箭头函数-函数内部就没有自己的this，跟外部环境一致
                2-call
                3-apply
                4-bind   



                2-call
                    用法
                3-apply
                4-bind   
        
        */
        /*
              2-call
 
              fn.call(参数1,参数2，参数3，...);
                call是函数的方法（万物皆对象-函数也是一个对象new Function()）
                作用；
                    调用fn函数本身，
                        fn运行时候的this 指向了 call的第一个参数  ,如果传入null 表示不改变原理的this试试
                        call 除了第一个参数，后面的参数都为成为 fn的实参

            fn.apply(参数1,[fn的参数1，fn的参数2，...]);
                apply是函数的方法（万物皆对象-函数也是一个对象new Function()）
                作用；
                    调用fn函数本身，
                        fn运行时候的this 指向了 call的第一个参数  ,如果传入null 表示不改变内部的this
                        apply 第二个参数，是一个数组，数组的元素 成为 fn的实参           


           call和apply的区别--
                相同点都会调用函数本身，第一个参数就是函数运行执行内部this 
                调用函数时候传入实参的方式不一样，
                    call除了第一个参数以外的参数都会成为实参
                    apply第二个参数是一个数组，数组的元素会成为 函数的实参             
        
        */
        function fn(a, b) {
            // {name: '张三'}
            console.log(this);
            console.log(a, b);
        }
        // fn();//-this-window
        let obj = { name: '张三' };

        // 调用fn，并且改变fn内部this 
        fn.call(obj, 100, 200);//this-> bj  a=100  b=200


        var arr = [9, 8, 7];
        var r = Math.max.apply(null, arr);

        // 调用Math.max函数 
        // Math.max(9,8,7) 
        var r = Math.max.call(null, ...arr);
        // var r = Math.max.call(null,9, 8, 7);

        console.log(Math.max(...arr));

        console.log(r);



        // apply 
        // 调用了fn，改变fn执行时候的this 为 obj，传入两个实参为 1000 2000
        fn.apply(obj, [1000, 2000])






    </script>

</body>

</html>